<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>数据、变量、内存的关系</title>
</head>

<body>
    <script>
        /* 1.什么是数据?
        存储在内存中代表特定信息的东西   本质上是0101010
        数据的特点:可传递 ,可运算
        一切皆数据
        内存中所有操作的目标：数据

         算数运算
         逻辑运算
         赋值
         运行函数

        2.什么是内存?
        内存条通电后产生的可存储数据的空间(临时的)

        内存产生和死亡:内存条通电产生电位差形成内存空间和数据，可以处理数据,断电后内存和数据就会消失

        一块小内存的两个数据, 除了里面存的值还有它的地址值

        内存分类:
        栈:全局变量/局部变量
        堆:对象

        3.什么是变量?
        变化的量  由变量名和变量值组成  每个变量都对应一块小内存
        变量名用来查找对应的内存  变量值就是内存中保存的数据

        4.内存、数据、变量三者之间的关系?
        内存用来存储数据的空间
        变量是内存的标识
        */

        //一些相关的问题**********************

        /* 一、问题:var a=xxx,a内存中到底保存的是什么
            如果是基本数据类型，那么保存的就是数据的值
            如果是对象，保存的就是对象的地址值
            
            注:如果xxx是一个变量,保存的就是xxx的内容（这个内容可能是基本数据值 也可能是地址）
            var b={};
            var a=b;    
        */

        /* 二、关于引用变量赋值的问题 
          2个引用变量指向同一个对象 通过一个变量修改对象内部的数据 另一个变量看到的是修改之后的数据 

          2个应用变量指向同一个对象,让其中一个变量指向另一个对象,另一个引用变量依然指向前一个对象
        */
        /* var obj1 = { name: 'Tom' };
        var obj2 = obj1;
        obj1.name = 'jack';
        console.log(obj2.name);

        function fn(obj) {
            obj.name = 'a';
        }
        fn(obj1);
        console.log(obj2.name); */
        //通过函数传递的实参形参也是一种赋值的操作  把obj1的内容赋值给obj  只是这个值是一个地址值


        /* var a = { age: 12 };
        var b = a;
        a = { name: 'Bob', age: 11 };
        b.age = 14;
        console.log(b.age, a.name, a.age); */

        //这里确实把a的存的地址值给了obj,但是函数中obj又指向了新的对象,对a没有影响
        /* function fn2(obj) {
            obj = { age: 16 };
        }
        fn2(a);
        console.log(a.age); */


        //三、在js调用函数时传递变量参数时，是值传递还是引用传递
        /* 理解1:在传递时都是值(基本值/地址值)传递 */
        /* 理解2:可能是值传递也可能是引用传递(地址值) */



        /* var a = 3;
        function fn(a) {
            a = a + 1;
        }
        fn(a);
        console.log(a);//输出3 */
        //因为这里只是把a的值传给了函数里面的a，和外面的a没有关系了

        function fn2(obj) {
            console.log(obj.name);
        }
        var obj = { name: 'Tom' };
        fn2(obj);


        //四、JS引擎如何管理内存?
        /*  
        1.内存生命周期
           分配小内存空间,得到它的使用权
           存储数据,可以反复进行操作
           释放小内存空间    
 
        2.释放内存 
            局部变量:函数执行完自动释放
            对象:成为垃圾对象==>垃圾回收器回收
         */

        var a = 3;
        var obj = {};
        obj = null;//此时内没有释放

        function fn() {
            var b = {};
        }
        fn();//函数执行完毕后b自动释放,b所指向的对象是在后面的某个时刻由垃圾回收器回收
    </script>
</body>

</html>